package com.ds.common.org.expression.org;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

import com.ds.common.expression.ParseException;
import com.ds.common.expression.function.Function;
import com.ds.org.Org;
import com.ds.org.OrgManager;
import com.ds.org.Role;
import com.ds.server.OrgManagerFactory;

/**
 * 取得指定某些组织机构角色下的所有组织机构，已包含组织机构去重功能。
 * <p>
 * Title: JDSORG组织机构中间件
 * </p>
 * <p>
 * Description:
 * </p>
 * <p>
 * Copyright: jds Copyright (c) 2003-2008
 * </p>
 * <p>
 * Company: www.justdos.net
 * </p>
 * 
 * @author wenzhangli
 * @version 2.0
 */
public class GetOrgByOrgRoles extends Function {
    public GetOrgByOrgRoles() {
	numberOfParameters = 2;
    }

    public void run(Stack stack) throws ParseException {
	checkStack(stack); // check the stack

	Object param2 = stack.pop();
	stack.push(perform(param2));
    }

    protected Org[] perform(Object param1) throws ParseException {
	if (param1 == null) {
	    return new Org[0];
	}
	// String，“:”隔开
	if (param1 instanceof String) {
	    OrgManager orgManager = OrgManagerFactory.getOrgManager();

	    String roleNames = (String) param1;
	    StringTokenizer st = new StringTokenizer(roleNames, ":");
	    List result = new ArrayList();
	    while (st.hasMoreTokens()) {
		List<Org> orgs = orgManager.getOrgsByOrgRoleName(st.nextToken());
		for (Org org : orgs) {
		    if (!result.contains(org)) {
			result.add(org);
		    }
		}
	    }
	    return (Org[]) result.toArray(new Org[result.size()]);
	}

	// OrgRole数组
	if (param1 instanceof Role[]) {
	    OrgManager orgManager = OrgManagerFactory.getOrgManager();
	    Role[] roles = (Role[]) param1;
	    List result = new ArrayList();
	    for (int i = 0, m = roles.length; i < m; i++) {
		String roleId = roles[i].getRoleId();
		List<Org> orgs = orgManager.getOrgsByOrgRoleName(roleId);
		for (Org org : orgs) {
		    if (!result.contains(org)) {
			result.add(org);
		    }
		}

	    }
	    return (Org[]) result.toArray(new Org[result.size()]);
	}

	throw new ParseException("Invalid parameter type in:" + this.getClass().getName() + ", param1 is " + param1.getClass().getName());
    }
}
